#ifndef SC_DEVICEMSG_H
#define SC_DEVICEMSG_H

#include "common.h"

#include <stdbool.h>
#include <stdint.h>
#include <unistd.h>

// 设备信息的最大长度
#define DEVICE_MSG_MAX_SIZE (1 << 18) // 256k
// type: 1 byte; length: 4 bytes
#define DEVICE_MSG_TEXT_MAX_LENGTH (DEVICE_MSG_MAX_SIZE - 5)

// android设备信息类型
enum sc_device_msg_type {
    // clipboard,剪切板信息
    DEVICE_MSG_TYPE_CLIPBOARD,

    // 剪切板应答
    DEVICE_MSG_TYPE_ACK_CLIPBOARD,
    DEVICE_MSG_TYPE_UHID_OUTPUT,
};

// Android设备消息 = java代码中的 DeviceMessage
struct sc_device_msg {
    enum sc_device_msg_type type;
    union {
        struct {
            char *text; // owned, to be freed by free()
        } clipboard;
        struct {
            uint64_t sequence;
        } ack_clipboard;
        struct {
            uint16_t id;
            uint16_t size;
            uint8_t *data; // owned, to be freed by free()
        } uhid_output;
    };
};

// 设备消息反序列化
// @param buf 实际上是 sc_device_msg 类型的
// @param len 缓冲区的大小
// @param msg （回写）反序列化成功的消息
// @return return the number of bytes consumed (0 for no msg available, -1 on error)
ssize_t
sc_device_msg_deserialize(const uint8_t *buf, size_t len,
                          struct sc_device_msg *msg);

/*
销毁 sc_device_msg 占用的资源
@param msg sc_device_msg
*/
void
sc_device_msg_destroy(struct sc_device_msg *msg);

#endif
